home *** CD-ROM | disk | FTP | other *** search
/ FishMarket 1.0 / FishMarket v1.0.iso / fishies / 351-375 / disk_360 / uucp / uucp0.lzh / src / sendmail / domain.c < prev    next >
C/C++ Source or Header  |  1990-04-04  |  5KB  |  210 lines

  1.  
  2. /*
  3.  *  DOMAIN.C
  4.  *
  5.  *  $Header: Beta:src/uucp/src/sendmail/RCS/domain.c,v 1.1 90/02/02 12:14:59 dillon Exp Locker: dillon $
  6.  *
  7.  *  (C) Copyright 1989-1990 by Matthew Dillon,  All Rights Reserved.
  8.  *
  9.  *  Given the first machine in a path scan the domain list and
  10.  *  return the type, class, and address of the resource entry.
  11.  *
  12.  *  AUTOMATIC HACKS:    scans L.sys file and automatically deals
  13.  *            with machine[.UUCP] domain, returning
  14.  *            Type=MD Class=UU Addr=machine.UUCP
  15.  */
  16.  
  17. #include "defs.h"
  18.  
  19. Prototype DomainLookup(char *, int, char *, char *, char *);
  20. Prototype CompareDomain(char **, short, char **, short);
  21.  
  22. extern char *DefaultNode;
  23. extern char *NodeName;
  24.  
  25. int
  26. DomainLookup(name, len, tb, cb, ab)
  27. char *name;
  28. int len;
  29. char *tb;
  30. char *cb;
  31. char *ab;
  32. {
  33.     char *dary[16];
  34.     char *tmp = malloc(len + 1);
  35.     char *tbase = tmp;
  36.     short b, i;
  37.     short di;
  38.     FILE *fi;
  39.     short level;        /*    best domain level found so far */
  40.     static char buf[256];
  41.  
  42.     for (b = i = di = 0; i < len && name[i] != '!'; ++i) {
  43.     if (name[i] == '.') {
  44.         if (di == sizeof(dary)/sizeof(dary[0]) - 1) {
  45.         ulog(-1, "DomainLookup, too many domains! %s", name);
  46.         break;
  47.         }
  48.         strncpy(tmp, name + b, i - b);
  49.         tmp[i - b] = 0;
  50.         dary[di] = tmp;
  51.         tmp += i - b + 1;
  52.         b = i + 1;
  53.         ++di;
  54.     }
  55.     }
  56.     strncpy(tmp, name + b, i - b);
  57.     tmp[i - b] = 0;
  58.     dary[di++] = tmp;
  59.  
  60. #ifdef NOTDEF
  61.     {
  62.     short i;
  63.     for (i = 0; i < di; ++i)
  64.         printf("XX '%s'\n", dary[i]);
  65.     }
  66. #endif
  67.  
  68.     /*
  69.      *    Check local mail
  70.      */
  71.  
  72.     level = 0;
  73.  
  74.     if (strcmpi(dary[0], NodeName) == 0) {
  75.     strcpy(tb, "--");   /*  not used by caller */
  76.     strcpy(cb, "LL");
  77.     strcpy(ab, "--");
  78.     level = 1;
  79.     }
  80.  
  81.     if (level == 0 && (fi = fopen(MakeConfigPath(UULIB, "Domain"), "r"))) {
  82.     while (fgets(buf, sizeof(buf), fi)) {
  83.         short l2;
  84.         short di2 = 0;
  85.         char *dary2[16];
  86.  
  87.         if (buf[0] == ' ' || buf[0] == 9 || buf[0] == '\n' || buf[0] == '#')
  88.         continue;
  89.         for (b = i = 0; buf[i] && buf[i] != ' ' && buf[i] != 9; ++i) {
  90.         if (buf[i] == '.') {
  91.             if (di2 == sizeof(dary2)/sizeof(dary2[0]) - 1) {
  92.             ulog(-1, "%s, entry has too many subdomains: %s", MakeConfigPath(UULIB, "Domain"), buf);
  93.             break;
  94.             }
  95.             dary2[di2++] = buf + b;
  96.             buf[i] = 0;
  97.             b = i + 1;
  98.         }
  99.         }
  100.         buf[i] = 0;
  101.         dary2[di2++] = buf + b;
  102.  
  103.         buf[i] = 0;     /*  get domain name/wildcard        */
  104.  
  105.         l2 = CompareDomain(dary, di, dary2, di2);
  106.  
  107. #ifdef NOTDEF
  108.         {
  109.         short i;
  110.         printf("\nres %d\n", l2);
  111.         for (i = 0; i < di; ++i)
  112.             printf("#1 %s\n", dary[i]);
  113.         for (i = 0; i < di2; ++i)
  114.             printf("#2 %s\n", dary2[i]);
  115.         }
  116. #endif
  117.  
  118.         if (l2 > level) {   /*  better domain then what we have     */
  119.         sscanf(buf + i + 1, "%s %s %s", tb, cb, ab);
  120.         level = l2;
  121.         }
  122.     }
  123.     fclose(fi);
  124.     }
  125.  
  126.     /*
  127.      *    Couldn't find the appropriate domain entry, check L.sys
  128.      *    OR domain entry is a forwarder, check L.sys
  129.      */
  130.  
  131.     if (strcmp(tb, "MF") == 0 || level == 0) {
  132.     if (fi = fopen(MakeConfigPath(UULIB, "L.sys"), "r")) {
  133.         while (fgets(buf, sizeof(buf), fi)) {
  134.         if (buf[0] == ' ' || buf[0] == 9 || buf[0] == '#' || buf[0] == '\n')
  135.             continue;
  136.         for (i = 0; buf[i] && buf[i] != ' ' && buf[i] != 9; ++i);
  137.         buf[i] = 0;
  138.         if (strcmpi(dary[0], buf) == 0) {
  139.             strcpy(tb, "MD");
  140.             strcpy(cb, "UU");
  141.             strcpy(ab, buf);
  142.             strcat(ab, ".UUCP");
  143.             level = 1;
  144.             break;
  145.         }
  146.         }
  147.         fclose(fi);
  148.     }
  149.     }
  150.  
  151.     /*
  152.      *    Couldn't find nothing, use DefaultNode
  153.      */
  154.  
  155.     if (level == 0) {
  156.     ulog(-1, "Warning, unable to interpret addr %s, using DefaultNode", name);
  157.     if (DefaultNode == NULL) {
  158.         ulog(-1, "Error, DefaultNode must exist if no Domain file");
  159.         printf("ERROR, no entry in Domain, L.sys, and\n");
  160.         printf("no DefaultNode config entry for %s\n", name);
  161.         puts("cannot send mail");
  162.         free(tbase);
  163.         return(0);
  164.     }
  165.     strcpy(tb, "MF");
  166.     strcpy(cb, "UU");
  167.     strcpy(ab, DefaultNode);
  168.     level = 1;
  169.     }
  170.     free(tbase);
  171.     return(level > 0);
  172. }
  173.  
  174. /*
  175.  *  Compares a broken up address with a domain entry (buf).
  176.  */
  177.  
  178. int
  179. CompareDomain(da1, di1, da2, di2)
  180. char **da1;
  181. short di1;
  182. char **da2;
  183. short di2;
  184. {
  185.     short i, j;
  186.     short level = 0;
  187.  
  188.     for (i = di1 - 1, j = di2 - 1; i >= 0 && j >= 0; --i, --j) {
  189.     if (da2[j][0] == '*') {
  190.         ++level;
  191.         if (i && j == 0)    /*  so loop does not terminate  */
  192.         ++j;
  193.         continue;
  194.     }
  195.     if (strcmpi(da1[i], da2[j]) == 0)
  196.         level += 2;
  197.     else {
  198.         if (j + 1 < di2 && da2[j+1][0] == '*') {
  199.         ++level;
  200.         ++j;
  201.         } else
  202.         return(0);
  203.     }
  204.     }
  205.     if (j >= 0)         /*  didn't exhaust domain entry */
  206.     return(0);
  207.     return((int)level);
  208. }
  209.  
  210.